package com.ycsyxt.guide;

import java.math.BigInteger;

/**
 * 二进制
 *
 * @author ycs(15241496739 @ 163.com)
 * @date 2022/6/5
 **/
public class Class1 {
    /**
     * 把握数学的工具属性
     * 学习具体方法时先溯因再求果
     * 勤于思考结局相同问题的不同方法
     * 不同问题的相同方法之间的联系和区别
     */
// 什么是二进制
//    十进制计数使用10作为基数，如1234可以看成1 * 10 ^ 3 + 2 * 10 ^ 2 + 3 * 10 ^ 1 + 4 * 10 ^ 1;
//    二进制计数使用2作为基数，  如1010可以看成 1 * 2 ^ 3 +  0 * 2 ^ 2 + 1 * 2 ^ 1 + 0 * 2 ^ 0;

//二进制和十进制的转换
//
//    除模取余,将余数反写，例如将106转换成二进制
//
//
//         2 | 106
//         2 | 53 ... 0
//         2 | 26 ... 1
//         2 | 13 ... 0
//         2 | 6  ... 1
//         2 | 3  ... 0
//         2 | 1  ... 1
//         2 | 0  ... 1  ↑ 反写余数，结果：1101010

//    减法
//    确定结果范围，128 > 106 > 64，64 = 2 ^ 6，结果是7位：0000000
//
//            106 - 64 = 42
//
//            42 - 32 = 10
//
//            10 - 8 = 2
//
//            106 = 64 + 32 + 8 + 2 = 2 ^ 6 + 2 ^ 5 + 2 ^ 3 + 2 ^ 1
//
//            7位结果0000000（编号6543210）里从右往左数，第6,5,3,1位应该为1，结果1101010
    public static void main(String[] args) {
        System.out.println(decimalToBinary(106));
        System.out.println(binaryToDecimal("1101010"));
    }

    /**
     * 十进制转换成二进制
     *
     * @param decimal
     * @return
     */
    public static String decimalToBinary(int decimal) {
        BigInteger bi = new BigInteger(String.valueOf(decimal));
        return bi.toString(2);
    }

    /**
     * 二进制转换成十进制
     *
     * @param binary
     * @return
     */
    public static String binaryToDecimal(String binary) {
        BigInteger bi = new BigInteger(binary, 2);
        return bi.toString();
    }
//    二进制左移一位就是将数字翻倍，右移一位就是将数字除2取整。
//
//    计算机为什么使用二进制
//
//    二进制的数据表达具有抗干扰能力强，可靠性优的特点，非常适合与或非等逻辑运算。
}
